package leetcode.interviewClassics;

/**
 * @author Cheng Jun
 * Description: 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。
 * 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
 * @version 1.0
 * @date 2021/10/29 21:53
 */
public class oneEditAway {

    public static void main(String[] args) {
        System.out.println(oneEditAway("teacher", "12eacher"));
    }

    // 数组长度角度考虑，数组长度相差大于 1 就返回 false
    // 数组长度 相差等于 0，每个字母依次比较，最多只能错一次
    // 数组长度 相差 等于1， 每个字母依次比较，匹配不上就错位
    static boolean oneEditAway(String first, String second) {
        int lengthDiff = first.length() - second.length();
        if (Math.abs(lengthDiff) > 1) {
            return false;
        }
        char[] firstArray = first.toCharArray();
        char[] secondArray = second.toCharArray();
        int fault = 0;
        if (lengthDiff == 0) {

            for (int i = 0; i < firstArray.length; i++) {
                if (firstArray[i] != secondArray[i] && ++fault > 1) return false;
            }
            return true;
        }
        if (Math.abs(lengthDiff) == 1) {
            // 循环条件 初始化语句 都可以写多个
            for (int i = 0, j = 0; i < firstArray.length && j < secondArray.length; i++, j++) {
                if (firstArray[i] != secondArray[j]) {
                    if (++fault > 1) {
                        return false;
                    }
                    if (firstArray.length > secondArray.length) {
                        j--;
                    } else {
                        i--;
                    }
                }
            }
        }
        return true;
    }
}
